API: gdk: Add gdk_rgba_is_clear() and gdk_rgba_is_opaque()
authorBenjamin Otte <otte@redhat.com>
Sun, 18 Dec 2016 21:31:18 +0000 (22:31 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 20 Dec 2016 17:01:12 +0000 (18:01 +0100)
I want to use these inside GSK, and I'm not a fan of putting GdkRGBA
APIs into it or duplicating it into GTK.

So public API it is.

docs/reference/gdk/gdk4-sections.txt
gdk/gdkrgba.c
gdk/gdkrgba.h
gtk/gtkcssshadowvalue.c
gtk/gtkcsstypesprivate.h
gtk/gtkrenderbackground.c
gtk/gtkwindow.c

index 7d3bd5fc38921c8f772073087382c52b25a6c808..4cc50408fe6b0237d9883e8253fe09169cf10b15 100644 (file)
@@ -222,6 +222,8 @@ gdk_pixbuf_get_from_surface
 GdkRGBA
 gdk_rgba_copy
 gdk_rgba_free
+gdk_rgba_is_clear
+gdk_rgba_is_opaque
 gdk_rgba_parse
 gdk_rgba_equal
 gdk_rgba_hash
index 2a8e09693aa5dc9db80b3a5af9d33cf4347348f3..a073790d44d82df17b52dfe3894a545053e13747 100644 (file)
@@ -90,6 +90,40 @@ gdk_rgba_free (GdkRGBA *rgba)
   g_slice_free (GdkRGBA, rgba);
 }
 
+/**
+ * gdk_rgba_is_clear:
+ * @rgba: a #GdkRGBA
+ *
+ * Checks if an @rgba value is transparent. That is, drawing with the value
+ * would not produce any change.
+ *
+ * Returns: %TRUE if the @rgab is clear
+ *
+ * Since: 3.90
+ */
+gboolean
+gdk_rgba_is_clear (const GdkRGBA *rgba)
+{
+  return rgba->alpha < ((double) 0x00ff / (double) 0xffff);
+}
+
+/**
+ * gdk_rgba_is_opaque:
+ * @rgba: a #GdkRGBA
+ *
+ * Checks if an @rgba value is opaque. That is, drawing with the value
+ * will not retain any results from previous contents.
+ *
+ * Returns: %TRUE if the @rgab is opaque
+ *
+ * Since: 3.90
+ */
+gboolean
+gdk_rgba_is_opaque (const GdkRGBA *rgba)
+{
+  return rgba->alpha > ((double)0xff00 / (double)0xffff);
+}
+
 #define SKIP_WHITESPACES(s) while (*(s) == ' ') (s)++;
 
 /* Parses a single color component from a rgb() or rgba() specification
index a37711ae391df8ad36d6d53154ea8bccca94e8fe..3a9e85c1dfb25782b85fd7b2527b0d8d37fbe06e 100644 (file)
@@ -52,6 +52,11 @@ GdkRGBA * gdk_rgba_copy      (const GdkRGBA *rgba);
 GDK_AVAILABLE_IN_ALL
 void      gdk_rgba_free      (GdkRGBA       *rgba);
 
+GDK_AVAILABLE_IN_3_90
+gboolean  gdk_rgba_is_clear  (const GdkRGBA *rgba);
+GDK_AVAILABLE_IN_3_90
+gboolean  gdk_rgba_is_opaque (const GdkRGBA *rgba);
+
 GDK_AVAILABLE_IN_ALL
 guint     gdk_rgba_hash      (gconstpointer  p);
 GDK_AVAILABLE_IN_ALL
index 86b30296dad56c848c05cf2552c31a3b55294081..f68a39e66c06ad501cfcab0b6a03286ac76c400d 100644 (file)
@@ -533,7 +533,7 @@ _gtk_css_shadow_value_paint_layout (const GtkCssValue *shadow,
   g_return_if_fail (shadow->class == &GTK_CSS_VALUE_SHADOW);
 
   /* We don't need to draw invisible shadows */
-  if (gtk_rgba_is_clear (_gtk_css_rgba_value_get_rgba (shadow->color)))
+  if (gdk_rgba_is_clear (_gtk_css_rgba_value_get_rgba (shadow->color)))
     return;
 
   if (!cairo_has_current_point (cr))
@@ -579,7 +579,7 @@ _gtk_css_shadow_value_paint_icon (const GtkCssValue *shadow,
   g_return_if_fail (shadow->class == &GTK_CSS_VALUE_SHADOW);
 
   /* We don't need to draw invisible shadows */
-  if (gtk_rgba_is_clear (_gtk_css_rgba_value_get_rgba (shadow->color)))
+  if (gdk_rgba_is_clear (_gtk_css_rgba_value_get_rgba (shadow->color)))
     return;
 
   cairo_save (cr);
@@ -898,7 +898,7 @@ _gtk_css_shadow_value_paint_box (const GtkCssValue   *shadow,
   g_return_if_fail (shadow->class == &GTK_CSS_VALUE_SHADOW);
 
   /* We don't need to draw invisible shadows */
-  if (gtk_rgba_is_clear (_gtk_css_rgba_value_get_rgba (shadow->color)))
+  if (gdk_rgba_is_clear (_gtk_css_rgba_value_get_rgba (shadow->color)))
     return;
 
   cairo_clip_extents (cr, &x1c, &y1c, &x2c, &y2c);
@@ -1034,7 +1034,7 @@ gtk_css_shadow_value_snapshot_outset (const GtkCssValue   *shadow,
   g_return_if_fail (shadow->class == &GTK_CSS_VALUE_SHADOW);
 
   /* We don't need to draw invisible shadows */
-  if (gtk_rgba_is_clear (_gtk_css_rgba_value_get_rgba (shadow->color)))
+  if (gdk_rgba_is_clear (_gtk_css_rgba_value_get_rgba (shadow->color)))
     return;
 
   gtk_css_shadow_value_get_extents (shadow, &extents);
@@ -1060,7 +1060,7 @@ gtk_css_shadow_value_snapshot_inset (const GtkCssValue   *shadow,
   g_return_if_fail (shadow->class == &GTK_CSS_VALUE_SHADOW);
 
   /* We don't need to draw invisible shadows */
-  if (gtk_rgba_is_clear (_gtk_css_rgba_value_get_rgba (shadow->color)))
+  if (gdk_rgba_is_clear (_gtk_css_rgba_value_get_rgba (shadow->color)))
     return;
 
   cr = gtk_snapshot_append_cairo_node (snapshot,
index b9a4fce534ef434a61978c1c6ba0fc44307a112c..87582e5137f5284fc3cea011e3912fac5e381882 100644 (file)
@@ -370,10 +370,6 @@ char *                  gtk_css_change_to_string                 (GtkCssChange
 void                    gtk_css_change_print                     (GtkCssChange       change,
                                                                   GString           *string);
 
-/* for lack of better place to put it */
-/* mirror what cairo does */
-#define gtk_rgba_is_clear(rgba) ((rgba)->alpha < ((double)0x00ff / (double)0xffff))
-
 G_END_DECLS
 
 #endif /* __GTK_CSS_TYPES_PRIVATE_H__ */
index 4beafb203d0b4add9adc9cb42dd9eda618993a6a..1e2a5e672ae4e4b9bb3c515d63c42f818ef2b1dc 100644 (file)
@@ -86,7 +86,7 @@ gtk_theming_background_snapshot_color (GtkThemingBackground *bg,
      (gtk_css_style_get_value (bg->style, GTK_CSS_PROPERTY_BACKGROUND_CLIP), 
       n_values - 1));
 
-  if (gtk_rgba_is_clear (bg_color))
+  if (gdk_rgba_is_clear (bg_color))
     return;
 
   if (gsk_rounded_rect_is_rectilinear (&bg->boxes[clip]))
@@ -587,7 +587,7 @@ gtk_css_style_render_background (GtkCssStyle      *style,
   box_shadow = gtk_css_style_get_value (style, GTK_CSS_PROPERTY_BOX_SHADOW);
 
   /* This is the common default case of no background */
-  if (gtk_rgba_is_clear (bg_color) &&
+  if (gdk_rgba_is_clear (bg_color) &&
       _gtk_css_array_value_get_n_values (background_image) == 1 &&
       _gtk_css_image_value_get_image (_gtk_css_array_value_get_nth (background_image, 0)) == NULL &&
       _gtk_css_shadows_value_is_none (box_shadow))
@@ -665,7 +665,7 @@ gtk_css_style_snapshot_background (GtkCssStyle      *style,
   box_shadow = gtk_css_style_get_value (style, GTK_CSS_PROPERTY_BOX_SHADOW);
 
   /* This is the common default case of no background */
-  if (gtk_rgba_is_clear (bg_color) &&
+  if (gdk_rgba_is_clear (bg_color) &&
       _gtk_css_array_value_get_n_values (background_image) == 1 &&
       _gtk_css_image_value_get_image (_gtk_css_array_value_get_nth (background_image, 0)) == NULL &&
       _gtk_css_shadows_value_is_none (box_shadow))
index 536994a5a1d17b749ebb547c4bf270a5bc2586e3..1d03a667b5daf826dee506b1298665259a4e4727 100644 (file)
@@ -6811,15 +6811,13 @@ update_opaque_region (GtkWindow           *window,
   cairo_region_t *opaque_region;
   GtkStyleContext *context;
   gboolean is_opaque = FALSE;
-  const GdkRGBA *color;
 
   if (!_gtk_widget_get_realized (widget))
       return;
 
   context = gtk_widget_get_style_context (widget);
 
-  color = _gtk_css_rgba_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BACKGROUND_COLOR));
-  is_opaque = (color->alpha >= 1.0);
+  is_opaque = gdk_rgba_is_opaque (_gtk_css_rgba_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BACKGROUND_COLOR)));
 
   if (gtk_widget_get_opacity (widget) < 1.0)
     is_opaque = FALSE;